/*
    信号3
    定时器
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

// 定时器 闹铃服务
// 轮询 poll vs 推送 push

void timer(int sid)
{
    printf("子进程：收到信号！\n");
    // 静态局部变量 
    static int count = 0;
    printf("子进程 ： %d\n", ++count);
    alarm(3);
}

int main()
{
    int pid = fork();
    if(pid == -1)
    {
        perror("进程创建失败！\n");
        exit(1);
    }
    if(pid == 0)
    {
        // 子进程中返回的是pid = 0
        // 在子进程中
        printf("子进程创建成功，接收信号。。。\n");
        // 注册接收 SIGALRM，执行定时器函数
        signal(SIGALRM, timer);
        //进程挂起，等待信号
        while(1)
        {
            //挂起进程，等待接收信号并且该信号的处理函数返回后，pause也会返回，执行pause之后的代码
            pause();
        }
    }
    else
    {
        printf("主进程启动...\n");
        sleep(2);
        // 给子进程发送闹铃信号
        kill(pid, SIGALRM);
        // 两秒后发出一个系统信号 ALRM 给自己
        // alarm(2);
        // 主进程返回的是子进程的pid
        pause();
    }
    return 0;
}